package booroo;

public class J12_SungJuk_v4b {

	public static void main(String[] args) {
		// 접근 지정자를 이용해서 SungJuk 클래스 정의
		J12SungJuk sj = new J12SungJuk();
		// sj.name = "지현";
		// name 멤버변수는 접근지정자가 private이므로 위 코드처럼 작성하면 오류 발생!
		sj = new J12SungJuk("지현", 98, 45, 12);
		// 어쩔수없이 생성자를 이용해서 name, kor, eng, mat멤버변수를 초기화
		// System.out.println(sj.name);
		// 하지만, 기존 방식으로 name변수를 출력하려해도 private 접근지정자 때문에 오류 발생!
		// 따라서 private으로 선언된 멤버변수를 조작하거나 값을 읽어오려면
		// 그것을 위한 특별한 메서드를 작성하는 것이 좋음
		// 실무에서는 setter/getter 메서드를 작성함
		sj.setName("수지");
		sj.setKor(87);
		sj.setEng(85);
		sj.setMat(82);
		sj.getTot();
		sj.getAvg();
		sj.getGrd();
		/*System.out.println(sj.getName());
		System.out.println(sj.getKor());
		System.out.println(sj.getEng());
		System.out.println(sj.getMat());*/
		
		// toString() 메서드를 이용해서 객체의 모든 멤버변수 출력하기
		System.out.println(sj.toString());
	} // main

} // class

class J12SungJuk{
	private String name;
	private int kor, eng, mat;
	private int tot;
	private double avg;
	private char grd;
	
	public J12SungJuk() {}
	public J12SungJuk(String name, int kor, int eng, int mat) {
		this.name = name;
		this.kor = kor;
		this.eng = eng;
		this.mat = mat;
	}
	// setter 메서드
	// public void set멤버변수명(자료형 멤버변수명){
	//		this.멤버변수명 = 멤버변수명;
	// }
	public void setName(String name){
		this.name = name;
	}
	// getter 메서드
	// public 멤버변수자료형 get멤버변수명(){
	// 		return 멤버변수명;
	// }
	public String getName(){
		return name;
	}
	public void setKor(int kor){
		this.kor = kor;
	}
	public int getKor(){
		return kor;
	}
	public void setEng(int eng){
		this.eng = eng;
	}
	public int getEng(){
		return eng;
	}
	public void setMat(int mat){
		this.mat = mat;
	}
	public int getMat(){
		return mat;
	}
	
	// 객체지향 프로그래밍에서는 메서드에 너무 많은 책임을 부여하는 것을 
	// 금지하고 있음
	// 예를 들어, getTot 메서드를 살펴보면 단순히 tot 변수의 값을 읽어오는 기능외에
	// 입력한 성적데이터에 대한 총점을 구하는 기능도 포함
	
	public int getTot(){
		tot = kor + eng + mat;
		return tot;
	}
	public double getAvg(){
		avg = tot / 3;
		return avg;
	}
	public char getGrd(){
		switch ((int)avg/10){
		case 10: case 9: grd = '수'; break;
		case 8: grd = '우'; break; 
		case 7: grd = '미'; break;
		case 6: grd = '양'; break;
		case 5: case 4: case 3: case 2: case 1:
		case 0: grd = '가'; 
		}
		return grd;
	}
	// 멤버변수의 모든 값을 출력하기 위해 Object 클래스에서 기본으로 제공하는 
	// 메서드인 toString()을 재정의override
	@Override	// 어노테이션 : 컴파일러를 위한 주석
	public String toString() {
		String result = "";
		result = result + "이름 : " + name + " ";
		result += "국어 : " + kor + " ";
		result += "영어 : " + eng + " ";
		result += "수학 : " + mat + " ";
		result += "총점 : " + tot + " ";
		result += "평균 : " + avg + " ";
		result += "학점 : " + grd;
		return result;
	}
}
